package io.renren.common.utils;

import io.renren.common.dto.MsgTextDTO;
import io.renren.common.exception.RenException;

import java.util.Optional;
import java.util.regex.Pattern;

/**
 * 解析短信
 */
public class SMSUtils {

    public SMSUtils(){}

    public SMSUtils(MsgTextDTO msgTextDTO){
        this.msgTextDTO = msgTextDTO;
    }

    private MsgTextDTO msgTextDTO;

    public MsgTextDTO getSMSObject(){
        return this.msgTextDTO;
    }


    /**
     * 解析短信为对象
     * @param content
     * @return
     */
    public static SMSUtils smsBuild(String content){
        MsgTextDTO dto = new MsgTextDTO();
        dto.setContent(content);
        String phone = SMSUtils.getCode(content, SMSType.PHONE11.getRegex(),SMSUtils.SMSType.PHONE11.getLen());
        String code6 = SMSUtils.getCode(content, SMSUtils.SMSType.CODE6.getRegex(),SMSUtils.SMSType.CODE6.getLen());
        String code4 = SMSUtils.getCode(content, SMSUtils.SMSType.CODE4.getRegex(),SMSUtils.SMSType.CODE4.getLen());
        dto.setPhone(phone);
        dto.setCode6(code6);
        dto.setCode4(code4);
        return new SMSUtils(dto);
    }

    enum SMSType{
        CODE4("[0-9]{4}",4),
        CODE6("[0-9]{6}",6),
        PHONE11("1[0-9]{10}",10);
        SMSType(String regex,int len){
            this.regex = regex;
            this.len= len;
        }
        private String regex;
        private Integer len;
        public String getRegex() {
            return regex;
        }
        public Integer getLen() {
            return len;
        }
    }
    /**
     * 11位数字表示电话号码
     * 4位验证码
     * 6位验证码
     * 带小数点的是金额
     * @param content
     * @param regex
     * @return
     */
    public static String getCode(String content,String regex,int len){
        String code = content;
        if(code == null){
            throw new RenException("短信不能为空");
        }
        if(Pattern.matches(regex,code)){
            return code;
        }
        String str1[] = code.split(regex);
        /**
         * 重组短信，将同一条短信中的不同格式验证过的验证码排除
         */
        for (String s:str1){
            content +=s;
        }
        if(str1==null || str1.length == 0 || str1.length == 1){
            return null;
        }
        if(str1[0].length()+len>len){
            code = code.substring(str1[0].length(),str1[0].length()+len);
        }
        if(Pattern.matches(regex,code)){
            return code;
        }
        return null;
    }
    /**
     * @param dto
     * @return
     */
    public static SMSUtils smsBuild(MsgTextDTO dto){
        return new SMSUtils(dto);
    }
}
